home *** CD-ROM | disk | FTP | other *** search
- /******************************************************************************
- *
- * NSSDC/CDF CDFdump - dump all records found in .CDF file.
- *
- * Version 2.0, 4-Mar-92, ST Systems (STX)
- *
- * Modification history:
- *
- * V1.0 29-May-91, J Love Original version.
- * V1.1 25-Jun-91, J Love Moved increment. Display fill value. Display
- * extend records. CDF_EPOCH added as a data
- * type. Added QOP. Added PageInst.
- * V1.2 26-Jul-91, J Love Added SEEK_CUR. Added XDR decoding.
- * Use 'Exit'/'ExitBAD'.
- * V1.3 7-Oct-91, J Love Modified for IBM-PC port (and IBM-RS6000).
- * V2.0 4-Mar-92, J Love IBM PC port/CDF V2.2.
- *
- ******************************************************************************/
-
- #include "cdflib.h"
- #include "cdfdump.h"
-
- /******************************************************************************
- * Global variables.
- ******************************************************************************/
-
- static long usedBytes = 0;
- static long wastedBytes = 0;
- static long GDRcount = 0;
- static long CDRcount = 0;
- static long ADRcount = 0;
- static long AEDRcount = 0;
- static long VDRcount = 0;
- static long VXRcount = 0;
- static long VVRcount = 0;
- static long UNUSEDcount = 0;
-
- /******************************************************************************
- * MAIN.
- ******************************************************************************/
-
- #if defined(vms)
- main (argc, argv)
- #else
- main (argc, argv)
- #endif
- int argc;
- char *argv[];
- {
- File *CDFfp;
- FILE *OUTfp;
- char CDFpath[CDF_FILE_NAME_LEN + 1];
- char oSpec[MAX_PATH_LEN+1];
- char oDir[MAX_DIR_LEN+1];
- char oName[MAX_NAME_LEN+1];
- long int4;
- char docText[CDF_DOCUMENT_LEN + 1];
- long recordSize;
- long recordType;
- long offset;
- long numDims;
- long encoding;
- long i;
- long VarFlags;
- long nBytes;
- long numElements;
- long dataType;
- long *firstRec;
- long *lastRec;
- long *VVRoffset;
- long Nentries;
- void *fillValue;
- char attrName[CDF_ATTR_NAME_LEN + 1];
- char varName[CDF_VAR_NAME_LEN + 1];
- char REFvarFileName[CDF_FILE_NAME_LEN + 1];
- void *ptr;
- void *valuePtr;
- char string[80+1];
- char string1[80+1];
- struct EPOCH ep;
- enum { BRIEF_, FULL_ } level;
- int count;
-
- QOP *qop;
- static char *validQuals[] = { "output", "brief", "full", NULL };
- static int optRequired[] = { TRUE, FALSE, FALSE, 0 };
-
- #if defined(vms)
- static char *instructions[] = {
- "Usage: CDFDUMP [/OUTPUT=<output-file>] [/BRIEF or /FULL] <cdf-name>",
- NULL };
- #endif
-
- #if defined(unix) | defined(__MSDOS__)
- static char *instructions[] = {
- "Usage: cdfdump [-output <output-file>] [-brief or -full] <cdf-name>",
- NULL };
- #endif
-
- /******************************************************************************
- * Determine qualifiers/options/parameters.
- ******************************************************************************/
-
- switch (argc == 1) {
- case 1:
- PageInst (instructions);
- Exit;
- default:
- qop = Qop (argc, argv, validQuals, optRequired);
- if (qop == NULL) ExitBAD;
-
- if (qop->Nparms < 1) {
- printf ("Missing parameter.\n");
- ExitBAD;
- }
- else {
- strcpy (CDFpath, qop->parms[0]);
- if (strstr(CDFpath,".cdf") == NULL && strstr(CDFpath,".CDF") == NULL)
- strcat(CDFpath,".cdf");
- #if VIO_FOR_STREAM
- CDFfp = Open (CDFpath, "rb", 1); /* only 1 buffer, sequential reads */
- #else
- CDFfp = Open (CDFpath, "rb");
- #endif
- if (CDFfp == NULL) {
- printf ("Error opening CDF.\n");
- ExitBAD;
- }
- }
-
- if (qop->qualEntered[0]) {
- strcpy (oSpec, qop->qualOpt[0]);
- ParsePath (oSpec, oDir, oName);
- if (strchr(oName,'.') == NULL) strcat (oSpec, ".dmp");
- OUTfp = fopen (oSpec, "w");
- if (OUTfp == NULL) {
- printf ("Unable to open output file (%s).\n", oSpec);
- ExitBAD;
- }
- }
- else
- OUTfp = stdout;
-
- count = 0;
- if (qop->qualEntered[1]) count++;
- if (qop->qualEntered[2]) count++;
-
- switch (count) {
- case 0:
- level = BRIEF_;
- break;
- case 1:
- if (qop->qualEntered[1])
- level = BRIEF_;
- else
- level = FULL_;
- break;
- default:
- printf ("Conflicting qualifiers.\n");
- ExitBAD;
- }
-
- break;
- }
-
- /******************************************************************************
- * Dump magic number(s).
- ******************************************************************************/
-
- getint32 (CDFfp, int4);
- if (level == FULL_) fprintf (OUTfp, "Magic number (1): %8lX (hex)\n", int4);
-
- getint32 (CDFfp, int4);
- if (level == FULL_) fprintf (OUTfp, "Magic number (2): %8lX (hex)\n", int4);
-
- usedBytes += 8;
-
- /******************************************************************************
- * Read and dump records until EOF (or illegal record) reached.
- ******************************************************************************/
-
- for (;;) {
- /***************************************************************************
- * record size
- ***************************************************************************/
-
- offset = Tell (CDFfp);
-
- recordSize = 0; /* Just in case. */
-
- getint32 (CDFfp, recordSize);
- if (Eof(CDFfp)) {
- DisplayStats (OUTfp);
- Exit;
- }
-
- if (recordSize <= 0) {
- DisplayStats (OUTfp);
- Exit;
- }
-
- if (level == FULL_)
- fprintf (OUTfp, "\nRecord size: %ld (at byte offset %ld)\n",
- recordSize, offset);
-
- /***************************************************************************
- * record type
- ***************************************************************************/
-
- getint32 (CDFfp, recordType);
- if (level == FULL_) fprintf (OUTfp, "Record type: %ld ", recordType);
-
- if (level == FULL_)
- switch (recordType) {
- case CDR_: fprintf (OUTfp, "(CDR)\n"); break;
- case GDR_: fprintf (OUTfp, "(GDR)\n"); break;
- case VDR_: fprintf (OUTfp, "(VDR)\n"); break;
- case VXR_: fprintf (OUTfp, "(VXR)\n"); break;
- case VVR_: fprintf (OUTfp, "(VVR)\n"); break;
- case ADR_: fprintf (OUTfp, "(ADR)\n"); break;
- case AEDR_: fprintf (OUTfp, "(AEDR)\n"); break;
- case UNUSED_: fprintf (OUTfp, "(UNUSED)\n"); break;
- default: fprintf (OUTfp, "(Unknown: %ld\n", recordType);
- }
-
- switch (recordType) {
- /************************************************************************
- * Unused record
- ************************************************************************/
-
- case UNUSED_:
- UNUSEDcount++;
-
- nBytes = recordSize - 8;
-
- ptr = (void *) malloc (nBytes);
- CHECKmalloc (ptr);
- Read (ptr, nBytes, 1, CDFfp);
- free (ptr);
-
- wastedBytes += recordSize;
- break;
-
- /************************************************************************
- * CDF descriptor record
- ************************************************************************/
-
- case CDR_:
- CDRcount++;
-
- getint32 (CDFfp, int4);
- if (level == FULL_) fprintf (OUTfp, "GDRoffset: %ld\n", int4);
-
- getint32 (CDFfp, int4);
- if (level == FULL_) fprintf (OUTfp, "version: %ld\n", int4);
-
- getint32 (CDFfp, int4);
- if (level == FULL_) fprintf (OUTfp, "release: %ld\n", int4);
-
- getint32 (CDFfp, encoding);
- if (level == FULL_) fprintf (OUTfp, "encoding: %ld\n", encoding);
-
- getint32 (CDFfp, int4);
- if (level == FULL_) fprintf (OUTfp, "CDFflags: %ld\n", int4);
-
- getint32 (CDFfp, int4);
- if (level == FULL_) fprintf (OUTfp, "rfuA: %ld\n", int4);
-
- getint32 (CDFfp, int4);
- if (level == FULL_) fprintf (OUTfp, "rfuB: %ld\n", int4);
-
- getint32 (CDFfp, int4);
- if (level == FULL_) fprintf (OUTfp, "increment: %ld\n", int4);
-
- getint32 (CDFfp, int4);
- if (level == FULL_) fprintf (OUTfp, "rfuD: %ld\n", int4);
-
- getint32 (CDFfp, int4);
- if (level == FULL_) fprintf (OUTfp, "rfuE: %ld\n", int4);
-
- Read (docText, CDF_DOCUMENT_LEN, 1, CDFfp);
- if (level == FULL_) fprintf (OUTfp, "copyright follows...\n%s\n",
- docText);
-
- usedBytes += recordSize;
- break;
-
- /************************************************************************
- * Global descriptor record
- ************************************************************************/
-
- case GDR_:
- GDRcount++;
-
- getint32 (CDFfp, int4);
- if (level == FULL_) fprintf (OUTfp, "VDRhead: %ld\n", int4);
-
- getint32 (CDFfp, int4);
- if (level == FULL_) fprintf (OUTfp, "garbage1: %ld\n", int4);
-
- getint32 (CDFfp, int4);
- if (level == FULL_) fprintf (OUTfp, "ADRhead: %ld\n", int4);
-
- getint32 (CDFfp, int4);
- if (level == FULL_) fprintf (OUTfp, "Eof: %ld\n", int4);
-
- getint32 (CDFfp, int4);
- if (level == FULL_) fprintf (OUTfp, "numVar: %ld\n", int4);
-
- getint32 (CDFfp, int4);
- if (level == FULL_) fprintf (OUTfp, "numAttr: %ld\n", int4);
-
- getint32 (CDFfp, int4);
- if (level == FULL_) fprintf (OUTfp, "maxRec: %ld\n", int4);
-
- getint32 (CDFfp, numDims);
- if (level == FULL_) fprintf (OUTfp, "numDims: %ld\n", numDims);
-
- getint32 (CDFfp, int4);
- if (level == FULL_) fprintf (OUTfp, "rfuA: %ld\n", int4);
-
- getint32 (CDFfp, int4);
- if (level == FULL_) fprintf (OUTfp, "rfuB: %ld\n", int4);
-
- getint32 (CDFfp, int4);
- if (level == FULL_) fprintf (OUTfp, "rfuD: %ld\n", int4);
-
- getint32 (CDFfp, int4);
- if (level == FULL_) fprintf (OUTfp, "rfuD: %ld\n", int4);
-
- getint32 (CDFfp, int4);
- if (level == FULL_) fprintf (OUTfp, "rfuE: %ld\n", int4);
-
- for (i = 0; i < numDims; i++) {
- getint32 (CDFfp, int4);
- if (level == FULL_) fprintf (OUTfp, " dimSize[%ld]: %ld\n",
- i, int4);
- }
-
- usedBytes += recordSize;
- break;
-
- /************************************************************************
- * Variable descriptor record
- ************************************************************************/
-
- case VDR_:
- VDRcount++;
-
- getint32 (CDFfp, int4);
- if (level == FULL_) fprintf (OUTfp, "VDRnext: %ld\n", int4);
-
- getint32 (CDFfp, dataType);
- if (level == FULL_) fprintf (OUTfp, "dataType: %ld\n", dataType);
-
- getint32 (CDFfp, int4);
- if (level == FULL_) fprintf (OUTfp, "varMaxRec: %ld\n", int4);
-
- getint32 (CDFfp, int4);
- if (level == FULL_) fprintf (OUTfp, "VXRhead: %ld\n", int4);
-
- getint32 (CDFfp, int4);
- if (level == FULL_) fprintf (OUTfp, "VXRtail: %ld\n", int4);
-
- getint32 (CDFfp, VarFlags);
- if (level == FULL_) fprintf (OUTfp, "VARflags: %ld\n", VarFlags);
-
- getint32 (CDFfp, int4);
- if (level == FULL_) fprintf (OUTfp, "rfuA: %ld\n", int4);
-
- getint32 (CDFfp, int4);
- if (level == FULL_) fprintf (OUTfp, "rfuB: %ld\n", int4);
-
- getint32 (CDFfp, int4);
- if (level == FULL_) fprintf (OUTfp, "rfuC: %ld\n", int4);
-
- getint32 (CDFfp, int4);
- if (level == FULL_) fprintf (OUTfp, "REFvarNum: %ld\n", int4);
-
- Read (REFvarFileName, CDF_FILE_NAME_LEN, 1, CDFfp);
- if (level == FULL_) fprintf (OUTfp, "REFfileName: %s\n",
- REFvarFileName);
-
- getint32 (CDFfp, numElements);
- if (level == FULL_) fprintf (OUTfp, "numElements: %ld\n",
- numElements);
-
- getint32 (CDFfp, int4);
- if (level == FULL_) fprintf (OUTfp, "varNum: %ld\n", int4);
-
- getint32 (CDFfp, int4);
- if (level == FULL_) fprintf (OUTfp, "rfuD: %ld\n", int4);
-
- getint32 (CDFfp, int4);
- if (level == FULL_) fprintf (OUTfp, "extend records: %ld\n", int4);
-
- Read (varName, CDF_VAR_NAME_LEN, 1, CDFfp);
- if (level == FULL_) fprintf (OUTfp, "varName: %s\n", varName);
-
- for (i = 0; i < numDims; i++) {
- getint32 (CDFfp, int4);
- if (level == FULL_) fprintf (OUTfp, " dimVary[%ld]: %ld\n",
- i, int4);
- }
-
- if (bitset(VarFlags,VAR_FILLVALUE_BIT)) {
- nBytes = ElemSize(dataType) * numElements;
- fillValue = (void *) malloc (nBytes);
- CHECKmalloc (fillValue);
- Read (fillValue, nBytes, 1, CDFfp);
-
- DecodeBuffer (encoding, dataType, numElements, fillValue);
-
- strcpy (string, "Fill value: ");
-
- if (dataType == CDF_CHAR || dataType == CDF_UCHAR)
- strcat (string, "\"");
-
- for (i = 0; i < numElements; i++) {
- switch (dataType) {
- case CDF_INT1:
- case CDF_BYTE:
- sprintf (string1, "%d ",
- *((Schar *) fillValue + i));
- break;
- case CDF_UINT1:
- sprintf (string1, "%u ",
- *((Uchar *) fillValue + i));
- break;
- case CDF_CHAR:
- case CDF_UCHAR:
- sprintf (string1, "%c", *((char *) fillValue + i));
- break;
- case CDF_INT2:
- sprintf (string1, "%d ", *((short *) fillValue + i));
- break;
- case CDF_UINT2:
- sprintf (string1, "%u ",
- *((unsigned short *) fillValue + i));
- break;
- case CDF_INT4:
- sprintf (string1, "%ld ", *((long *) fillValue + i));
- break;
- case CDF_UINT4:
- sprintf (string1, "%lu ",
- *((unsigned long *) fillValue + i));
- break;
- case CDF_REAL4:
- case CDF_FLOAT:
- sprintf (string1, "%f ", *((float *) fillValue + i));
- break;
- case CDF_REAL8:
- case CDF_DOUBLE:
- sprintf (string1, "%f ", *((double *) fillValue + i));
- break;
- case CDF_EPOCH:
- ep.tSince0 = *((double *) fillValue + i);
- strcpy (string1, epochString(&ep));
- strcat (string1, " ");
- break;
- default:
- strcpy (string1, "?");
- break;
- }
-
- if (strlen(string) + strlen(string1) > 75) {
- strcat (string, "...");
- break;
- }
- else
- strcat (string, string1);
- }
-
- if (dataType == CDF_CHAR ||
- dataType == CDF_UCHAR) strcat (string, "\"");
- if (level == FULL_) fprintf (OUTfp, "%s\n", string);
- }
-
- usedBytes += recordSize;
- break;
-
- /************************************************************************
- * Variable Index record
- ************************************************************************/
-
- case VXR_:
- VXRcount++;
-
- getint32 (CDFfp, int4);
- if (level == FULL_) fprintf (OUTfp, "VXRnext: %ld\n", int4);
-
- getint32 (CDFfp, Nentries);
- if (level == FULL_) fprintf (OUTfp, "Nentries: %ld\n", Nentries);
-
- getint32 (CDFfp, int4);
- if (level == FULL_) fprintf (OUTfp, "NusedEntries: %ld\n", int4);
-
- firstRec = (long *) malloc (Nentries * sizeof(long));
- CHECKmalloc (firstRec);
- lastRec = (long *) malloc (Nentries * sizeof(long));
- CHECKmalloc (lastRec);
- VVRoffset = (long *) malloc (Nentries * sizeof(long));
- CHECKmalloc (VVRoffset);
-
- for (i = 0; i < Nentries; i++) getint32 (CDFfp, firstRec[i]);
- for (i = 0; i < Nentries; i++) getint32 (CDFfp, lastRec[i]);
- for (i = 0; i < Nentries; i++) getint32 (CDFfp, VVRoffset[i]);
-
- if (level == FULL_)
- fprintf (OUTfp, "\n Entry FirstRec LastRec VVRoffset\n");
- for (i = 0; i < Nentries; i++)
- if (level == FULL_)
- fprintf (OUTfp, " %2ld %5ld %5ld %9ld\n",
- i, firstRec[i], lastRec[i], VVRoffset[i]);
-
- free (firstRec);
- free (lastRec);
- free (VVRoffset);
-
- usedBytes += recordSize;
- break;
-
- /************************************************************************
- * Variable Values record
- ************************************************************************/
-
- case VVR_:
- VVRcount++;
-
- Seek (CDFfp, recordSize - VVR_BASE_SIZE, SEEK_CUR);
- usedBytes += recordSize;
- break;
-
- /************************************************************************
- * Attribute descriptor record
- ************************************************************************/
-
- case ADR_:
- ADRcount++;
-
- getint32 (CDFfp, int4);
- if (level == FULL_) fprintf (OUTfp, "ADRnext: %ld\n", int4);
-
- getint32 (CDFfp, int4);
- if (level == FULL_) fprintf (OUTfp, "AEDRhead: %ld\n", int4);
-
- getint32 (CDFfp, int4);
- if (level == FULL_) fprintf (OUTfp, "scope: %ld\n", int4);
-
- getint32 (CDFfp, int4);
- if (level == FULL_) fprintf (OUTfp, "attrNum: %ld\n", int4);
-
- getint32 (CDFfp, int4);
- if (level == FULL_) fprintf (OUTfp, "numEntries: %ld\n", int4);
-
- getint32 (CDFfp, int4);
- if (level == FULL_) fprintf (OUTfp, "maxEntry: %ld\n", int4);
-
- getint32 (CDFfp, int4);
- if (level == FULL_) fprintf (OUTfp, "rfuA: %ld\n", int4);
-
- getint32 (CDFfp, int4);
- if (level == FULL_) fprintf (OUTfp, "rfuB: %ld\n", int4);
-
- getint32 (CDFfp, int4);
- if (level == FULL_) fprintf (OUTfp, "rfuC: %ld\n", int4);
-
- getint32 (CDFfp, int4);
- if (level == FULL_) fprintf (OUTfp, "rfuD: %ld\n", int4);
-
- getint32 (CDFfp, int4);
- if (level == FULL_) fprintf (OUTfp, "rfuE: %ld\n", int4);
-
- Read (attrName, CDF_ATTR_NAME_LEN, 1, CDFfp);
- if (level == FULL_) fprintf (OUTfp, "attrName: %s\n", attrName);
-
- usedBytes += recordSize;
- break;
-
- /************************************************************************
- * Attribute entry descriptor record
- ************************************************************************/
-
- case AEDR_:
- AEDRcount++;
-
- getint32 (CDFfp, int4);
- if (level == FULL_) fprintf (OUTfp, "AEDRnext: %ld\n", int4);
-
- getint32 (CDFfp, int4);
- if (level == FULL_) fprintf (OUTfp, "attrNum: %ld\n", int4);
-
- getint32 (CDFfp, dataType);
- if (level == FULL_) fprintf (OUTfp, "dataType: %ld\n", dataType);
-
- getint32 (CDFfp, int4);
- if (level == FULL_) fprintf (OUTfp, "entryNum: %ld\n", int4);
-
- getint32 (CDFfp, numElements);
- if (level == FULL_) fprintf (OUTfp, "numElements: %ld\n",
- numElements);
-
- getint32 (CDFfp, int4);
- if (level == FULL_) fprintf (OUTfp, "rfuA: %ld\n", int4);
-
- getint32 (CDFfp, int4);
- if (level == FULL_) fprintf (OUTfp, "rfuB: %ld\n", int4);
-
- getint32 (CDFfp, int4);
- if (level == FULL_) fprintf (OUTfp, "rfuC: %ld\n", int4);
-
- getint32 (CDFfp, int4);
- if (level == FULL_) fprintf (OUTfp, "rfuD: %ld\n", int4);
-
- getint32 (CDFfp, int4);
- if (level == FULL_) fprintf (OUTfp, "rfuE: %ld\n", int4);
-
- nBytes = numElements * ElemSize(dataType);
- valuePtr = (void *) malloc (nBytes);
- CHECKmalloc (valuePtr);
- Read (valuePtr, nBytes, 1, CDFfp);
-
- DecodeBuffer (encoding, dataType, numElements, valuePtr);
-
- strcpy (string, "value: ");
-
- if (dataType == CDF_CHAR || dataType == CDF_UCHAR)
- strcat (string, "\"");
-
- for (i = 0; i < numElements; i++) {
- switch (dataType) {
- case CDF_INT1:
- case CDF_BYTE:
- sprintf (string1, "%d ",
- *((Schar *) valuePtr + i));
- break;
- case CDF_UINT1:
- sprintf (string1, "%u ",
- *((Uchar *) valuePtr + i));
- break;
- case CDF_CHAR:
- case CDF_UCHAR:
- sprintf (string1, "%c", *((char *) valuePtr + i));
- break;
- case CDF_INT2:
- sprintf (string1, "%d ", *((short *) valuePtr + i));
- break;
- case CDF_UINT2:
- sprintf (string1, "%u ",
- *((unsigned short *) valuePtr + i));
- break;
- case CDF_INT4:
- sprintf (string1, "%ld ", *((long *) valuePtr + i));
- break;
- case CDF_UINT4:
- sprintf (string1, "%lu ",
- *((unsigned long *) valuePtr + i));
- break;
- case CDF_REAL4:
- case CDF_FLOAT:
- sprintf (string1, "%f ", *((float *) valuePtr + i));
- break;
- case CDF_REAL8:
- case CDF_DOUBLE:
- sprintf (string1, "%f ", *((double *) valuePtr + i));
- break;
- case CDF_EPOCH:
- ep.tSince0 = *((double *) valuePtr + i);
- strcpy (string1, epochString(&ep));
- strcat (string1, " ");
- break;
- default:
- strcpy (string1, "?");
- break;
- }
-
- if (strlen(string) + strlen(string1) > 75) {
- strcat (string, "...");
- break;
- }
- else
- strcat (string, string1);
- }
-
- if (dataType == CDF_CHAR ||
- dataType == CDF_UCHAR) strcat (string, "\"");
- if (level == FULL_) fprintf (OUTfp, "%s\n", string);
-
- free (valuePtr);
-
- usedBytes += recordSize;
- break;
-
- /************************************************************************
- * Illegal record type.
- ************************************************************************/
- default:
- Close (CDFfp);
- fclose (OUTfp);
- DisplayStats (OUTfp);
- Exit;
- }
- }
- }
-
-
- /******************************************************************************
- * DisplayStats. Display statistics of the dump.
- ******************************************************************************/
-
- static void DisplayStats (OUTfp)
- FILE *OUTfp;
- {
- float totalBytes = usedBytes + wastedBytes;
- fprintf (OUTfp, "\n\n Used bytes: %9ld (%.1f%%).\n",
- usedBytes, 100.0 * usedBytes/totalBytes);
- fprintf (OUTfp, "Unused bytes: %9ld (%.1f%%).\n",
- wastedBytes, 100.0 * wastedBytes/totalBytes);
- fprintf (OUTfp, "\n CDR count: %9ld\n", CDRcount);
- fprintf (OUTfp, " GDR count: %9ld\n", GDRcount);
- fprintf (OUTfp, " ADR count: %9ld\n", ADRcount);
- fprintf (OUTfp, " AEDR count: %9ld\n", AEDRcount);
- fprintf (OUTfp, " VDR count: %9ld\n", VDRcount);
- fprintf (OUTfp, " VXR count: %9ld\n", VXRcount);
- fprintf (OUTfp, " VVR count: %9ld\n", VVRcount);
- fprintf (OUTfp, "UNUSED count: %9ld\n\n\n", UNUSEDcount);
- return;
- }
-